New test for progress events, .total and .loaded, when response is gzipped
diff --git a/XMLHttpRequest/progress-events-response-data-gzip.htm b/XMLHttpRequest/progress-events-response-data-gzip.htm new file mode 100644 index 0000000..97d50b6 --- /dev/null +++ b/XMLHttpRequest/progress-events-response-data-gzip.htm
@@ -0,0 +1,49 @@ +<!doctype html> +<html> + <head> + <title>XMLHttpRequest: progress events and GZIP encoding</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <link rel="help" href="http://www.w3.org/TR/progress-events/#firing-events-using-the-progressevent-interface-for-http" data-tested-assertations="following::p[contains(text(),'content-encodings')]" /> + <!-- TODO: find better spec reference when https://www.w3.org/Bugs/Public/show_bug.cgi?id=25587 is fixed --> + </head> + <body> + <div id="log"></div> + <script> + var test = async_test() + test.step(function() { + var client = new XMLHttpRequest() + /* + Two behaviours are considered acceptable, so there are two ways to pass this test + a) Provide "compressed download progress" data - event.total reflects the Content-length of the gzipp'ed resource, event.loaded how many gzipped bytes have arrived over the wire so far + b) If the implementation can't provide "compressed download progress" numbers, set lengthComputable to false for gzip'ed resources, set event.total to 0, and event.loaded to the number of bytes available so far after gzip decoding + + Implications of this are tested here as follows: + * If lengthComputable is true: + * Event.total must match Content-length header, event.loaded should be a smaller number while resource is loading and match Content-length when loading is finished + * Setting event.loaded to equal event.total for each progress event if the resource is not fully downloaded would be cheating + * If lengthComputable is false, event.total should be 0 and event.loaded should be the length of the decompressed content, i.e. bigger than Content-length + */ + client.addEventListener('loadend', test.step_func(function(e){ + var len = parseInt(client.getResponseHeader('content-length'), 10) + if(e.lengthComputable){ + assert_equals(e.total, len, 'event.total is content-length') + assert_equals(e.loaded, len, 'event.loaded should be content-length at loadend') + }else{ + assert_equals(e.total, 0, 'if implementation can\'t compute event.total for gzipped content it is 0') + assert_true(e.loaded >= len, 'event.loaded should be set even if total is not computable') + } + test.done(); + }), false) + client.addEventListener('progress', test.step_func(function(e){ + if(e.lengthComputable && e.total && e.target.readyState < 4){ + assert_false(e.total == e.loaded, 'total should not equal loaded while download/decode is incomplete') + } + }), false) + // image.gif is 62 bytes compressed. Sending 21 bytes at a time with 1 second delay will load it in 3 seconds + client.open("GET", "resources/image.gif?pipe=gzip|trickle(21:d1:r2)", true) + client.send() + }, document.title, {timeout:3500}) + </script> + </body> +</html>